﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GLWrapper;

namespace GameBaseCode
{
    public class Bitmapfont
    {
        private static char[,][] s_Font;   // The font it self, 51 chars that are 5x5 pixels
        private static int[] s_Transl;  // ascii translation table, indexes into s_Font 
        private static bool init_ed = false;

        public static void printAt(string text, int x1, int y1)
        {
            if (!init_ed)
            {
                init();
            }
            GL.glTranslatef(x1, y1, 0);
            print(text);
            GL.glTranslatef(-x1, -y1, 0);
        }
        public static void print(string text)
        {
            if (!init_ed)
            {
                init();
            }
            int i;
            int xp = 0; // Pixel position x1 y1
            //setColorByInt( color );
            GL.glBegin(GL.GL_POINTS);
            for (i = 0; i < text.Length; i++)
            {
                long pos = 0;
                if ((text[i] >= 'A') && (text[i] <= 'Z'))
                    pos = s_Transl[text[i] - ('A' - 'a')]; // 'A' - 'a' should give num of letters in alphabet, 26
                else
                    pos = s_Transl[text[i]]; // Use translation table

                int h, v; // Horizontal and vertical position
                for (v = 0; v < 5; v++)
                {
                    for (h = 0; h < 5; h++)
                        if (s_Font[pos, v][h] == 'o')
                        {
                            GL.glVertex3f((int) xp+h + 0.325f, (int)v + 0.325f, 0.0f);
                        }
                }
                xp += 6; // move along so we are ready for the next char
            }
            GL.glEnd();
        }

        // Original bitmap 5x5 font data taken from Jakko Bikkers 
        // raytracing tutorial hosted at gamedev.net
        private static void init()
        {
            s_Font = new char[51,5][];

	        SetChar( 0, ":ooo:", "o:::o", "ooooo", "o:::o", "o:::o" );
	        SetChar( 1, "oooo:", "o:::o", "oooo:", "o:::o", "oooo:" );
	        SetChar( 2, ":oooo", "o::::", "o::::", "o::::", ":oooo" );
	        SetChar( 3, "oooo:", "o:::o", "o:::o", "o:::o", "oooo:" );
	        SetChar( 4, "ooooo", "o::::", "oooo:", "o::::", "ooooo" );
	        SetChar( 5, "ooooo", "o::::", "ooo::", "o::::", "o::::" );
	        SetChar( 6, ":oooo", "o::::", "o:ooo", "o:::o", ":ooo:" );
	        SetChar( 7, "o:::o", "o:::o", "ooooo", "o:::o", "o:::o" );
	        SetChar( 8, "::o::", "::o::", "::o::", "::o::", "::o::" );
	        SetChar( 9, ":::o:", ":::o:", ":::o:", ":::o:", "ooo::" );
	        SetChar(10, "o::o:", "o:o::", "oo:::", "o:o::", "o::o:" );
	        SetChar(11, "o::::", "o::::", "o::::", "o::::", "ooooo" );
	        SetChar(12, "oo:o:", "o:o:o", "o:o:o", "o:::o", "o:::o" );
	        SetChar(13, "o:::o", "oo::o", "o:o:o", "o::oo", "o:::o" );
	        SetChar(14, ":ooo:", "o:::o", "o:::o", "o:::o", ":ooo:" );
	        SetChar(15, "oooo:", "o:::o", "oooo:", "o::::", "o::::" );
	        SetChar(16, ":ooo:", "o:::o", "o:::o", "o::oo", ":oooo" );
	        SetChar(17, "oooo:", "o:::o", "oooo:", "o:o::", "o::o:" );
	        SetChar(18, ":oooo", "o::::", ":ooo:", "::::o", "oooo:" );
	        SetChar(19, "ooooo", "::o::", "::o::", "::o::", "::o::" );
	        SetChar(20, "o:::o", "o:::o", "o:::o", "o:::o", ":oooo" );
	        SetChar(21, "o:::o", "o:::o", ":o:o:", ":o:o:", "::o::" );
	        SetChar(22, "o:::o", "o:::o", "o:o:o", "o:o:o", ":o:o:" );
	        SetChar(23, "o:::o", ":o:o:", "::o::", ":o:o:", "o:::o" );
	        SetChar(24, "o:::o", "o:::o", ":oooo", "::::o", ":ooo:" );
	        SetChar(25, "ooooo", ":::o:", "::o::", ":o:::", "ooooo" );
	        SetChar(26, ":ooo:", "o::oo", "o:o:o", "oo::o", ":ooo:" );
	        SetChar(27, "::o::", ":oo::", "::o::", "::o::", ":ooo:" );
	        SetChar(28, ":ooo:", "o:::o", "::oo:", ":o:::", "ooooo" );
	        SetChar(29, "oooo:", "::::o", "::oo:", "::::o", "oooo:" );
	        SetChar(30, "o::::", "o::o:", "ooooo", ":::o:", ":::o:" );
	        SetChar(31, "ooooo", "o::::", "oooo:", "::::o", "oooo:" );
	        SetChar(32, ":oooo", "o::::", "oooo:", "o:::o", ":ooo:" );
	        SetChar(33, "ooooo", "::::o", ":::o:", "::o::", "::o::" );
	        SetChar(34, ":ooo:", "o:::o", ":ooo:", "o:::o", ":ooo:" );
	        SetChar(35, ":ooo:", "o:::o", ":oooo", "::::o", ":ooo:" );
	        SetChar(36, "::o::", "::o::", "::o::", ":::::", "::o::" );
	        SetChar(37, ":ooo:", "::::o", ":::o:", ":::::", "::o::" );
	        SetChar(38, ":::::", ":::::", "::o::", ":::::", "::o::" );
	        SetChar(39, ":::::", ":::::", ":ooo:", ":::::", ":ooo:" );
	        SetChar(40, ":::::", ":::::", ":::::", ":::o:", "::o::" );
	        SetChar(41, ":::::", ":::::", ":::::", ":::::", "::o::" );
	        SetChar(42, ":::::", ":::::", ":ooo:", ":::::", ":::::" );
	        SetChar(43, ":::o:", "::o::", "::o::", "::o::", ":::o:" );
	        SetChar(44, "::o::", ":::o:", ":::o:", ":::o:", "::o::" );
	        SetChar(45, ":::::", ":::::", ":::::", ":::::", ":::::" );
	        SetChar(46, "ooooo", "ooooo", "ooooo", "ooooo", "ooooo" );
	        SetChar(47, "::o::", "::o::", ":::::", ":::::", ":::::" ); // Tnx Ferry
	        SetChar(48, "o:o:o", ":ooo:", "ooooo", ":ooo:", "o:o:o" );
	        SetChar(49, "::::o", ":::o:", "::o::", ":o:::", "o::::" );
	        char[] c = "abcdefghijklmnopqrstuvwxyz0123456789!?:=,.-() #'*/".ToCharArray();
	        int i;
            s_Transl = new int[256];
	        for ( i = 0; i < 256; i++ ) s_Transl[i] = 45;
	        for ( i = 0; i < 50; i++ ) s_Transl[(byte)c[i]] = i;
            init_ed = true;
        }


        private static void SetChar(int c, string c1, string c2, string c3, string c4, string c5)
        {
            s_Font[c, 0] = c1.ToCharArray();
            s_Font[c, 1] = c2.ToCharArray();
            s_Font[c, 2] = c3.ToCharArray();
            s_Font[c, 3] = c4.ToCharArray();
            s_Font[c, 4] = c5.ToCharArray();
        }
    } // end class
}
